using System;
using System.Collections.Generic;
using System.Text;
using Encog.Engine.Network.Activation;

namespace PW.Mini.SlepowronskiJ.Siec.Aktywacja
{
    [Serializable]
    public abstract class IFunkcjaAktywacji : IActivationFunction
    {
        protected string nazwa="";
        protected string rodzajPolarnosci = "";

        public const string SKALOWANIE_UNIPOLARNE = "unipolarna";
        public const string SKALOWANIE_BIPOLARNE = "bipolarna";

        /// <summary>
        /// The parameters.
        /// </summary>
        ///
        protected readonly double[] _paras = new double[0];

        /// <summary>
        ///  pobiera wartosc funkcji aktywacji
        /// </summary>
        /// <param name="x">x</param>
        /// <returns>f(x)</returns>
        public abstract double WartoscFunkcji(double x);

        /// <summary>
        /// pobiera wartosc pochodnej funkcji aktywacji
        /// </summary>
        /// <param name="x">x</param>
        /// <returns>f'(x)</returns>
        public abstract double WartoscPochodnejFunkcji(double x);

        /// <summary>
        /// zwraca nazwe funkcji wyswietlana w interfejsie
        /// </summary>
        public string Nazwa
        {
            get { return nazwa; }
        }

        /// <summary>
        /// zwraca pelna nazwe funkcji z uwzglednieniem polarnosci wyswietlana w interfejsie
        /// </summary>
        public string PelnaNazwa
        {
            get { return rodzajPolarnosci + " " + nazwa; }
        }

        /// <summary>
        /// zwraca polarnosc funkcji aktywacji
        /// </summary>
        public string RodzajPolarnosci
        {
            get { return rodzajPolarnosci; }
        }

        /// <inheritdoc />
        public virtual String[] ParamNames
        {
            get
            {
                String[] result = { };
                return result;
            }
        }


        /// <inheritdoc />
        public virtual double[] Params
        {
            get { return _paras; }
        }


        /// <returns>Return true, TANH has a derivative.</returns>
        public virtual bool HasDerivative()
        {
            return true;
        }

        /// <summary>
        /// Clone the object.
        /// </summary>
        /// <returns>The cloned object.</returns>
        public abstract object Clone();

        /// <inheritdoc />
        public virtual void ActivationFunction(double[] x, int start, int size)
        {
            for (int i = start; i < start + size; i++)
                x[i] = WartoscFunkcji(x[i]);
        }

        /// <inheritdoc />
        public virtual double DerivativeFunction(double x, double y)
        {
            return WartoscPochodnejFunkcji(x);
        }
    }
}
